﻿using System;
using System.Linq;
using System.Reflection;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using BrasilFramework.Controle.Silverlight.Comportamento;
using System.ComponentModel;

namespace BrasilFramework.Controle.Silverlight
{

    /// <summary>
    /// Extensão do <see cref="System.Windows.Controls.ComboBox"/> com rolagem, pesquisa pela primeira letra 
    /// e correção do ComboBox original, pois as propriedade SelectedValue, SelectedValuePath não fucionava em alguns momentos.
    /// </summary>
    public class ComboBox : System.Windows.Controls.ComboBox
    {
        public ComboBox()
        {
            if (DesignerProperties.IsInDesignTool) return;
            Loaded += ComboBox_Loaded;
        }

        public bool InserirItem { get; set; }

        #region Pesquisa Pela Primeira Letra

        private ScrollViewer _scrollViewer;

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            _scrollViewer = (ScrollViewer) GetTemplateChild("ScrollViewer");
            _scrollViewer.KeyDown += _scrollViewer_KeyDown;
        }

        private void _scrollViewer_KeyDown(object sender, KeyEventArgs e)
        {
            if (Items.Count == 0) return;

            object itemEncontrado;

            if (DisplayMemberPath.Length == 0)
            {
                itemEncontrado =
                    Items.FirstOrDefault(
                        item => item.GetType() == typeof(string) 
                            && ((string) item).StartsWith(e.Key.ToString(), StringComparison.CurrentCultureIgnoreCase));
            }
            else
            {
                Type itemType = Items[0].GetType();
                PropertyInfo propriedade = itemType.GetProperty(DisplayMemberPath);

                if (propriedade == null) return;

                itemEncontrado =
                    Items.FirstOrDefault(
                        item =>
                        ((string) propriedade.GetValue(item, null)).StartsWith(e.Key.ToString(),
                                                                      StringComparison.CurrentCultureIgnoreCase));
            }
            if (itemEncontrado == null) return;

            SelectedItem = itemEncontrado;
            IsDropDownOpen = true;
        }

        #endregion

        private void ComboBox_Loaded(object sender, RoutedEventArgs e)
        {
            MouseWheelScroll.Ativar(this);
            SelectionChanged += ComboBox_SelectionChanged;
            KeyDown += _scrollViewer_KeyDown;
        }

        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            IsDropDownOpen = false;
        }

    }
}